package inventario.code;

/**
 * Projeto Laboratorio de Programacao II
 * 
 * Classe Usuario
 * 
 * Implementa um Usuario do LSD
 * 
 * @authors : Pedro Augusto, Rafael Ribeiro, Talita Lobo
 * 
 */

import java.util.regex.*;

public class Usuario implements Pessoa {

	protected TipoDeUsuario tipo;
	protected String login;
	protected String senha;
	protected String email;
	protected String nome;
	private Maquina maquina;

	/**
	 * Construtor da classe Usuario
	 * 
	 * @param nome
	 *            Nome do usuario
	 * @param email
	 *            Email do usuario
	 * @param tipo
	 *            Tipo do usuario
	 * @param login
	 *            Login do usuario.
	 * @param senha
	 *            Senha do Usuario.
	 * @throws Exception
	 *             Caso o Tipo de Usuario/Login seja invalido.
	 * 
	 */
	public Usuario(String nome, String email, TipoDeUsuario tipo, String login,
			String senha) throws Exception {

		if (nome == null || nome.trim().isEmpty()) {
			throw new Exception("O Campo Nome nao Pode ser Vazio.");
		}
		if (email == null || email.trim().isEmpty()) {
			throw new Exception("O Campo Email nao Pode ser Vazio.");
		}

		String mail = email.toLowerCase();
		Pattern regex = Pattern.compile(".+\\@.+\\.[a-z]+");
		Matcher kaops = regex.matcher(mail);

		if (!kaops.matches()) {
			throw new Exception(
					"E-mail invalido, ele deve seguir o exemplo: \"pedro@gmail.com\".");
		}

		if (tipo == null) {
			throw new Exception("O tipo de usuario nao pode ser nulo.");
		}

		if (login == null || login.trim().isEmpty()) {
			throw new Exception("O Login nao pode ser nulo.");
		}

		if (senha == null || senha.trim().isEmpty()) {
			throw new Exception("A Senha nao pode ser nula.");
		}

		this.nome = nome;
		this.tipo = tipo;
		this.login = login;
		this.senha = senha;
		this.email = email;
	}

	/**
	 * Construtor da classe Usuario
	 * 
	 * @param nome
	 *            Nome do usuario
	 * @param email
	 *            Email do usuario
	 * @param tipo
	 *            Tipo do usuario
	 * @param login
	 *            Login do usuario.
	 * @param senha
	 *            Senha do Usuario.
	 * @throws Exception
	 *             Caso o Tipo de Usuario/Login seja invalido.
	 * 
	 */
	public Usuario(String nome, String email, TipoDeUsuario tipo, String login,
			String senha, Maquina maquina) throws Exception {

		if (nome == null || nome.trim().isEmpty()) {
			throw new Exception("O Campo Nome nao Pode ser Vazio.");
		}
		if (email == null || email.trim().isEmpty()) {
			throw new Exception("O Campo Email nao Pode ser Vazio.");
		}

		String mail = email.toLowerCase();
		Pattern regex = Pattern.compile(".+\\@.+\\.[a-z]+");
		Matcher kaops = regex.matcher(mail);

		if (!kaops.matches()) {
			throw new Exception(
					"E-mail invalido, ele deve seguir o exemplo: \"pedro@gmail.com\".");
		}

		if (tipo == null) {
			throw new Exception("O tipo de usuario nao pode ser nulo.");
		}

		if (login == null || login.trim().isEmpty()) {
			throw new Exception("O Login nao pode ser nulo.");
		}

		if (senha == null || senha.trim().isEmpty()) {
			throw new Exception("A Senha nao pode ser nula.");
		}

		this.nome = nome;
		this.tipo = tipo;
		this.login = login;
		this.senha = senha;
		this.email = email;
		this.maquina = maquina;
	}

	/**
	 * Recupera o login do usuario
	 * 
	 * @return login o login do usuario.
	 */
	public String getLogin() {
		return login;
	}

	/**
	 * Modifica o login do usuario
	 * 
	 * @param login
	 *            Novo login
	 */
	public void setLogin(String login) {
		this.login = login;
	}

	/**
	 * Recupera o tipo de usuario
	 * 
	 * @see TipoDeUsuario
	 * @return tipo O tipo de usuario.
	 */
	public TipoDeUsuario getTipoUsuario() {
		return tipo;
	}

	/**
	 * Metodo que muda o tipo de usuario
	 * 
	 * @param novoTipo
	 *            Novo tipo de usuario
	 */
	public void setTipoDeUsuario(TipoDeUsuario novoTipo) {
		tipo = novoTipo;
	}

	/**
	 * Recupera a senha do Usuario.
	 * 
	 * @return senha Senha do Usuario.
	 */
	public String getSenha() {
		return senha;
	}

	/**
	 * Modifica a Senha do Usuario.
	 * 
	 * @param senha
	 *            Senha a ser usada pelo Usuario.
	 * @throws Exception
	 */
	public void setSenha(String senha) throws Exception {
		this.senha = senha;
	}

	/**
	 * Dado um Objeto, Verifica Igualdade com Pessoa.
	 * 
	 * @return true caso o objeto seja igual a Pessoa, false caso contrario.
	 */
	@Override
	public boolean equals(Object objeto) {
		if (!(objeto instanceof Usuario)) {
			return false;

		}
		Usuario user = (Usuario) objeto;

		return getNome().equals(user.getNome())
				&& getEmail().equals(user.getEmail())
				&& getTipoUsuario().equals(user.getTipoUsuario());

	}

	/**
	 * 
	 * Recupera todas as Informacoes sobre Pessoa (Exceto senha.)
	 * 
	 * @return Todas Informacoes de Pessoa.
	 */
	@Override
	public String toString() {
		return ".: Nome - " + getNome() + "\n.: E-mail - " + getEmail()
				+ "\n.: Tipo de Usuario - " + getTipoUsuario()
				+ "\n.: Login - " + getLogin();
	}

	/**
	 * Metodo que recupera o nome do Usuario
	 */
	@Override
	public String getNome() {
		return nome;
	}

	/**
	 * Metodo que muda o nome do Usuario
	 */
	@Override
	public void setNome(String nome) {
		this.nome = nome;
	}

	/**
	 * Metodo que recupera o email do Usuario
	 */
	@Override
	public String getEmail() {
		return email;
	}

	/**
	 * Metodo que muda o email do Usuario
	 */
	@Override
	public void setEmail(String email) {
		this.email = email;

	}

	/**
	 * Metodo que retorna a maquina pertencente ao usuario
	 * 
	 * @return maquina
	 */
	public Maquina getMaquina() {
		return maquina;
	}

	/**
	 * Metodo que muda a maquina do usuario
	 * 
	 * @param novaMaquina
	 *            Nova maquina do usuario
	 */
	public void setMaquina(Maquina novaMaquina) {
		maquina = novaMaquina;
	}

}
